<?php
	
/**
 * 作者 ：wujehy
 * email:wujehy@qq.com
 * */	
	
/**
 * 解决 微信 小程序 登陆 问题
 * 实现  将 小程序 的 openid  与 私有 服务器 进行 交互 
 * 产生 apikey 
 * 
 * 返回的 数据 类型
 * 失败情况 
 * {
	  "status": "error",
	  "type": "login",
	  "apikey": ""
	}
 * 
 * 成功 的情况  apikey 本地 存在  
 * {
	  "status": "success",
	  "type": "login",
	  "apikey": "apikey"
	}
 * 
 * 如果 apikey  无效  则使用 登陆信息code 进行注册  查询 登陆
 * 
 * 登陆 成功 产生 一个 session 存储 apikey
 * 后续 操作 直接 apikey 进行 判断
 * 
 * */	

//导入 配置信息
include("./config.php");
//导入 登陆 信息 结构 
include("./loginTypeClass.php");

$dbconf=new DBConfig();
$reqData=new Login_type();
//全局参数 给 后续 流程 提供 信息 载体
$conn= new mysqli($dbconf->servername,$dbconf->username,$dbconf->password,$dbconf->dbname);
if ($conn->connect_error) {
	   // die("mysql连接失败: " . $conn->connect_error);
	   $reqData->status='error';
	   $reqData->type='mysql';
}

session_start();
if(@$_SESSION['apikey']==''){
	$_SESSION['apikey']='guest';
}

if(@$_SESSION['userid']==''){
	$_SESSION['userid']=0;
}

//echo $_SESSION['apikey'];
//上传 登陆信息 同时  获取 openid 并储存 

//获取 apikey 
//如果 apikey 不存在 则 不通过 筛选 
//如果 存在 则进行 判断
header('Content-Type:application/json; charset=utf8');
if(@$_GET['apikey']){

	$apikey=$_GET['apikey'];
	//查询 数据库是否存在 apikey 如果 存在 则 则证明 用户信息 是有效额 
	//有效 则 直接 返回 apikey 否则 进行  后面的步骤
	$sql="SELECT apikey FROM `wxuser` WHERE apikey='$apikey'";
	$result = $conn->query($sql);
	if($result->num_rows>0){
		//查询 数据 库 返回的是 查询到的结果有 几条 
		//如果 大于 0 条  意味着存在这条数据 表面 数据有效 则 输出信息		
		$reqData->status='success';
		$reqData->apikey=$apikey;
	}else{
		//如果 本地的 apikey 不存在 用户 信、信息表
		//则 读取 当前 wxlogin 的 临时 session key  ，使用 code 上传
		//code 是预设 信息
		if(@$_GET['code']){
			//获取 code 信息 ，仿http 向微信的api 获取 openid 
			$js_code=$_GET['code'];
			//http 请求 过程 begin
			$ch = curl_init();
			curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/sns/jscode2session?appid=wx80c84991a231fc18&secret=d7735c114f9ea0b9c7809b92c0319c34&js_code=".$js_code."&grant_type=authorization_code");
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			$response = curl_exec($ch); 
			$data=json_decode($response);
			
			//http 请求 结束 同时 返回信息 放进 $data
			if(@$data->errcode){
				//如果 返回的是  errcode 则 表面 登陆信息 过期 需要 重试
				$reqData->status='error';
				$reqData->apikey="";
//				echo "ok";
			}else if($data->openid){
				//如果 返回的 存在 openid 的字段  则 表面 请求成功 
				//进行  后续 操作
				//获取 openid 的信息
				$openid=$data->openid;
				//查询 通过 数据库 查询 openid 字段 的 apikey 
				$sql="SELECT apikey FROM `wxuser` WHERE openid='$openid'";
				//查询
				$result = $conn->query($sql);
				if($result->num_rows>0){
					//如果 数据库 该用户注册过了 
					//注册 过 意味着 有  apikey 
					//直接将  apikey 返回 跟新本地的 apikey
					$row =$result->fetch_assoc();
					$reqData->status='success';
					//将 数据库 查找到的 apikey 进行返回 
					$reqData->apikey=$row['apikey'];
					
				}else {
					//$sql="SELECT apikey FROM `wxuser` WHERE openid=$openid";
					//如果 数据库 不存在 这个openid 
					//则 向数据库 插入 当前 的openid 
					//同时 将产生  apikey
					//注 ：具体 的 生成 apikey 的 规则 可以自定
					$sql = "INSERT INTO `wxuser` ( `openid`, `apikey`) VALUES ('$openid', MD5('$openid'))";
					if ($conn->query($sql) === TRUE) {
					    $reqData->status='success';
					    //默认 生成 规则 同时 将 apikey 本地 生成 
					    //如果 其他的 规则 则需要 同时 跟新 两部分 
					    //否则  会导致 系统错误
						$reqData->apikey=md5($openid);
					} else {
						//如果 依旧 是被  则 只能返回错误
					   $reqData->status='error';
						$reqData->apikey="";
					}
				}
			}
		}
	}

}
//如果 登陆成功  则 跟新 服务器 user信息
if($reqData->status=="success"){
	$_SESSION['apikey']=$reqData->apikey;
	$sql="SELECT userid FROM `wxuser` WHERE apikey='$reqData->apikey'";
	$result = $conn->query($sql);
	if($result->num_rows>0){
		//查询 userid
		$row =$result->fetch_assoc();
		$_SESSION['userid']=$row['userid'];
	}
	//$reqData->userid=$_SESSION['userid'];
}
$reqData->apikey=$_SESSION['apikey'];
$reqData->userid=$_SESSION['userid'];
//返回 apikey 以及 成功信息
//经过上面的；业务 流程  将 返回的数据进行 json 打包 并显示
echo json_encode($reqData);



$conn->close();
//echo $_SESSION['userid'];

?>